package com.heima.leetcode.practice;

/**
 * leetcode 36. 有效的数独
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/15 14:38
 */
public class E36 {

    /**
     * 判断一个数独的题目是否是有效的
     * @param board 输入的数独
     * @return 返回是否有效
     */
    public boolean isValidSudoku(char[][] board) {
        int[][] rowCount = new int[9][9]; // 统计行每个数值出现的次数
        int[][] colCount = new int[9][9]; // 统计列每个数值出现的次数
        int[][] boxCount = new int[9][9]; // 统计九宫格每个数值出现的次数
        // 遍历一次数独，将三个数组初始化
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.') continue;
                int num = board[i][j] - '1';
                rowCount[i][num]++;
                colCount[j][num]++;
                int boxIndex = i / 3 * 3 + j / 3;
                boxCount[boxIndex][num]++;
                if (rowCount[i][num] > 1 || colCount[j][num] > 1 || boxCount[boxIndex][num] > 1) {
                    return false;
                }
            }
        }
        return true;
    }
}
